[小ネタ]fluent-plugin-aws-elasticsearch-serviceにて、重複行を登録させない設定
コンニチハ、千葉です。
fluent-plugin-aws-elasticsearch-serviceを利用してAmazon Elasticsearch Serviceへログを登録している環境があります。この環境でログを再送した時に同じログが数十件登録されました。具体的には、2万件ほどリダイレクトでログを書き込んでみたところ、同じログが10行から15行程登録されていました。これは困った。
ということで、ログを重複させない方法を調査してみました。
どうやるの?
まず前提として、Elasticsearchには_id
というフィールドが有り、ドキュメントの一意なIDとなります。このフィールドに一意なIDを指定することで重複を避けられそうです。(同じIDが送信された場合上書きされます)
そしてログに一意なID、request_id
を追加しておきます。この一意なrequest_id
を、ドキュメントのID_id
に指定することで、同じrequest_id
が送信された場合、上書きされるので、結果重複行をなくすことができそうです。
ログの例
{"timestamp":"2016-07-31T09:00:13.911+0900","request_id":"1234-1234-1234-1234-1234-111","msg":"test1"} {"timestamp":"2016-07-31T10:00:13.911+0900","request_id":"1234-1234-1234-1234-1234-222","msg":"test2"} {"timestamp":"2016-07-31T10:00:13.911+0900","request_id":"1234-1234-1234-1234-1234-333","msg":"test3"}
設定
fluent-plugin-aws-elasticsearch-serviceにはid_key
というパラメータが有ります。ここに、ESのフィールドを指定できるので、今回の例のログで一意なrequest_id
を指定します。
<source> type tail path xxx.log pos_file xxx.pos format json tag aws-es </source> <match aws-es> type "aws-elasticsearch-service" type_name "xxx" index_name xxx id_key request_id flush_interval 60s resurrect_after 5s reload_connections false <endpoint> url https://xxxx.ap-northeast-1.es.amazonaws.com region ap-northeast-1 </endpoint> </match>
ログをputしてみる
request_id
が_id
として登録されていることが確認できました!
最後に
これで重複登録が避けられそうです。基本的なことかもしれませんが、ログに一意なIDがある場合は、id_keyを指定したほうがよさそうです。 それでは、また。